package com.yimi.yinhepda.JPush;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import cn.jpush.android.api.JPushInterface;
import com.yimi.yinhepda.MainActivity;
import com.yimi.yinhepda.db.dao.MyMessageDao;
import com.yimi.yinhepda.entity.message.MyMessageBean;
import com.pda.ym.utils.DateHelper;
import com.yimi.yinhepda.views.message.MessageDetailActivity;
import com.yimi.yinhepda.views.message.MessageListActivity;
import java.sql.SQLException;
import java.util.Date;
import java.util.Iterator;
import org.json.JSONException;
import org.json.JSONObject;

/**
 * @author 000432
 * @date 2017/12/15 0015
 *
 * 如果不定义这个 Receiver，则：
 * 1) 默认用户会打开主界面
 * 2) 接收不到自定义消息
 */
public class JPushCustomReceiver extends BroadcastReceiver {
  private static final String TAG = "JIGUANG-Example";

  @Override public void onReceive(Context context, Intent intent) {
    try {
      Bundle bundle = intent.getExtras();
      Log.d(TAG, "[MyReceiver] onReceive - " + intent.getAction() + ", extras: " + printBundle(bundle));

      if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
        String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);
        Log.d(TAG, "[MyReceiver] 接收Registration Id : " + regId);
        //send the Registration Id to your server...

      } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
        Log.d(TAG, "[MyReceiver] 接收到推送下来的自定义消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE));
        processCustomMessage(context, bundle);
      } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
        Log.d(TAG, "[MyReceiver] 接收到推送下来的通知");
        //保存接收到的消息
        saveMessage(bundle);
        //刷新消息状态
        if (MainActivity.handler != null) {
          MainActivity.handler.sendEmptyMessage(MainActivity.READ_MESSAGE_TAG_STATUS);
        }
        //刷新消息界面
        if (MessageListActivity.handler != null) {
          MessageListActivity.handler.sendEmptyMessage(MessageListActivity.FLASH_MESSAGE_ACTIVITY);
        }
      } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
        Log.d(TAG, "[MyReceiver] 用户点击打开了通知");
        //消息通知ID
        String notfyId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID, 0) + "";
        intent = new Intent(context, MessageDetailActivity.class);
        intent.putExtra(MessageDetailActivity.MESSAGE_NOTIFICATION_ID, notfyId);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
        context.startActivity(intent);
      } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
        Log.d(TAG, "[MyReceiver] 用户收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA));
        //在这里根据 JPushInterface.EXTRA_EXTRA 的内容处理代码，比如打开新的Activity， 打开一个网页等..

      } else if (JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) {
        boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false);
        Log.w(TAG, "[MyReceiver]" + intent.getAction() + " connected state change to " + connected);
      } else {
        Log.d(TAG, "[MyReceiver] Unhandled intent - " + intent.getAction());
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * 保存推送的消息
   */
  private void saveMessage(Bundle bundle) {
    //消息通知ID
    String notfyId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID, 0) + "";
    //消息标题
    String title = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE, "");
    //消息文本内容
    String content = bundle.getString(JPushInterface.EXTRA_ALERT, "");
    //消息扩展内容
    String extraJson = bundle.getString(JPushInterface.EXTRA_EXTRA, "");
    JSONObject json = null;
    try {
      json = new JSONObject(extraJson);
    } catch (JSONException e) {
      e.printStackTrace();
    }
    //消息推送时间
    String pushTime = DateHelper.getDateTimeFormate(new Date());
    MyMessageBean bean = new MyMessageBean();
    bean.setNotificationId(notfyId);
    bean.setTitle(title);
    bean.setContent(content);
    bean.setPushTime(pushTime);
    bean.setCreateTime(DateHelper.getDateTimeFormate(new Date()));
    try {
      new MyMessageDao().insert(bean);
    } catch (SQLException e) {
      e.printStackTrace();
    }
  }

  /**
   * 打印所有的 intent extra 数据
   */
  private static String printBundle(Bundle bundle) {
    StringBuilder sb = new StringBuilder();
    for (String key : bundle.keySet()) {
      if (key.equals(JPushInterface.EXTRA_NOTIFICATION_ID)) {
        sb.append("\nkey:" + key + ", value:" + bundle.getInt(key));
      } else if (key.equals(JPushInterface.EXTRA_CONNECTION_CHANGE)) {
        sb.append("\nkey:" + key + ", value:" + bundle.getBoolean(key));
      } else if (key.equals(JPushInterface.EXTRA_EXTRA)) {
        if (TextUtils.isEmpty(bundle.getString(JPushInterface.EXTRA_EXTRA))) {
          Log.i(TAG, "This message has no Extra data");
          continue;
        }

        try {
          JSONObject json = new JSONObject(bundle.getString(JPushInterface.EXTRA_EXTRA));
          Iterator<String> it = json.keys();

          while (it.hasNext()) {
            String myKey = it.next();
            sb.append("\nkey:" + key + ", value: [" + myKey + " - " + json.optString(myKey) + "]");
          }
        } catch (JSONException e) {
          Log.e(TAG, "Get message extra JSON error!");
        }
      } else {
        sb.append("\nkey:" + key + ", value:" + bundle.getString(key));
      }
    }
    return sb.toString();
  }

  //send msg to MainActivity
  private void processCustomMessage(Context context, Bundle bundle) {
    //String message = bundle.getString(JPushInterface.EXTRA_MESSAGE);
    //String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);
    //Intent msgIntent = new Intent(MainActivity.MESSAGE_RECEIVED_ACTION);
    //msgIntent.putExtra(MainActivity.KEY_MESSAGE, message);
    //if (!JPushUtil.isEmpty(extras)) {
    //  try {
    //    JSONObject extraJson = new JSONObject(extras);
    //    if (extraJson.length() > 0) {
    //      msgIntent.putExtra(MainActivity.KEY_EXTRAS, extras);
    //    }
    //  } catch (JSONException e) {
    //
    //  }
    //}
  }
}
